package com.lqian.juc;

import java.util.concurrent.Phaser;

/**
 * 按照不同的阶段来执行 维护各自的阶段
 * java.util.concurrent包中的Phaser 构造。
 * 它是一个非常类似于CountDownLatch的构造，它允许我们协调线程的执行。
 * 与CountDownLatch相比，它具有一些附加功能。
 * ---
 * 我们可以协调多个执行阶段，为每个程序阶段重用一个Phaser实例。
 * 每个阶段可以有不同数量的线程等待推进到另一个阶段。
 * @author：Melody_LQ
 * @time：2022/8/13 2:29 下午
 */
public class PhaserDemo {

    public static void main(String[] args) {
        Phaser phaser = new Phaser();
        new Thread(new LongRunningAction("线程",phaser)).start();
    }

}

class LongRunningAction implements Runnable{
    private String threadName;
    private Phaser phaser;

    public LongRunningAction(String threadName, Phaser phaser) {
        this.threadName = threadName;
        this.phaser = phaser;
        //register()方法注册到Phaser实例,增加使用该特定Phaser 的线程数。
        phaser.register();
    }

    @Override
    public void run() {
        //调用arriveAndAwaitAdvance()来发出到达屏障的信号
        phaser.arriveAndAwaitAdvance();
        try {
            Thread.sleep(20);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //线程完成它的工作
        //调用arriveAndDeregister()方法来表示当前线程不应该在这个特定阶段被考虑。
        phaser.arriveAndDeregister();
    }
}